declare const config: Chainable
const result = config
.option('foo', 123)
.option('name', 'type-challenges')
.option('bar', { value: 'Hello World' })
.get()
interface Result {
foo: number
name: string
bar: {
value: string
}
}
type Chainable<T = {}> = {
option<K extends string, V>(
key: K extends keyof T ? (V extends T[K] ? never : K) : K,
value: V
): Chainable<Omit<T,K> & Record<K, V>>;
get(): T;
};
type Chainable<T = {}> = {
option<K extends string, V>(
key: K extends keyof T ? (V extends T[K] ? never : K) : K,
value: V
): Chainable<{
[Key in keyof T | K]: Key extends K
? V
: Key extends keyof T
? T[Key]
: never;
}>;
get(): T;
};